﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NHibernate;
using NHibernateSample.Domain.Entities;
using NHibernate.Criterion;

namespace NHibernateSample.DAL
{
    public class CRUD
    {
        protected ISession Session;

        public CRUD(ISession _session)
        {
            Session = _session;
        }

        /// <summary>
        /// 新建一个对象；调用ISession.Save()；同步ISession。
        /// </summary>
        /// <param name="customer"></param>
        /// <returns></returns>
        public int CreateCustomer(Customer customer)
        {
            //在数据访问层编写CreateCustomer()方法，把传过来的Customer对象保存在数据库中
            int newid = (int)Session.Save(customer);
            Session.Flush();
            return newid;
        }

        /// <summary>
        /// 获取一个对象；改变它的一些属性；调用ISession.Update()；同步ISession
        /// </summary>
        /// <param name="customer"></param>
        public void UpdateCustomer(Customer customer)
        {
            //在数据访问层编写UpdateCustomer()方法，修改Customer对象
            Session.Update(customer);
            Session.Flush();
        }

        /// <summary>
        /// 获取一个对象；调用ISession.Delete()；同步ISession
        /// </summary>
        /// <param name="customer"></param>
        public void DeleteCustomer(Customer customer)
        {
            //在数据访问层编写DeleteCustomer()方法，从数据库中删除Customer对象。
            Session.Delete(customer);
            Session.Flush();
        }

        /// <summary>
        /// ISession可以识别出这不同的对象，并为我们提供了ISession.SaveOrUpdate(object)方法
        ///     ISession.SaveOrUpdate(object)方法完成如下工作：
        ///         检查这个对象是否已经存在Session中。 
        ///         如果对象不在，调用Save(object)来保存。 
        ///         如果对象存在，检查这个对象是否改变了。 
        ///         如果对象改变，调用Update(object)来更新。
        /// </summary>
        /// <param name="customers"></param>
        public void SaveOrUpdateCustomer(IList<Customer> customers)
        {
            //在数据访问层编写SaveOrUpdateCustomer()方法，保存更新Customer对象列表，依次遍历列表中的Customer对象，调用ISession.SaveOrUpdate(object)方法保存更新每个Customer对象
            foreach (var c in customers)
            {
                Session.SaveOrUpdate(c);
            }
            Session.Flush();
        }

    }
}
